function [best_state aligned_mix]= alignMixturesWithAnnealing(source_mix, target_mix, init_state, tt, options)

best_state = init_state;
for i = 1:length(tt)
    scale = tt(i);
    
    mix1 = source_mix;
    mix1.covars = mix1.covars + repmat(eye(mix1.nin), [1 1 mix1.ncentres])*scale;
    mix2 = target_mix;
    mix2.covars = mix2.covars + repmat(eye(mix2.nin), [1 1 mix2.ncentres])*scale;
    mix3 = transformGMM2DRigid(best_state, source_mix);
    mix3.covars = mix3.covars + repmat(eye(mix3.nin), [1 1 mix3.ncentres])*scale;
    
    hold off
    visualiseGMM(mix1, [], [], [1 0 0])
    hold on
    drawnow
    axis equal
    visualiseGMM(mix2, [], [], [0 1 0])
    drawnow
    axis equal
    visualiseGMM(mix3, [], [], [0 0 1])
    drawnow
    axis equal
    
    best_state = scg('gmm2DRigidObjective', best_state, options, 'gmm2DRigidGradient', mix1, mix2);
end

aligned_mix = transformGMM2DRigid(best_state, source_mix);
